using System;
using System.Collections.Generic;

namespace Test.ConsoleProgram.Algorithm.Work
{
    [TestDescription("工作逻辑: 数组有且只有一个项为是")]
    public class Test_ListFirstDefault : AbsBaseTestItem
    {
        /*
        算法要求:
        当输入数组中没有 true(表示默认项) 则最后一条为true
        当输入数组中只有一条 true 不变数组输出
        当输入数组中有多条 true 只保留最后一个 其他全部为false
        */

        public override void OnTest()
        {
            Assert.TestExe(DefaultValue,
                new bool[] { false, false, false, false },
                new bool[] { false, false, false, true });

            Assert.TestExe(DefaultValue,
                new bool[] { false, true, false, false },
                new bool[] { false, true, false, false });

            Assert.TestExe(DefaultValue,
                new bool[] { false, false, false, true },
                new bool[] { false, false, false, true });

            Assert.TestExe(DefaultValue,
                new bool[] { true, true, false, false },
                new bool[] { false, true, false, false });

            Assert.TestExe(DefaultValue,
                new bool[] { false, true, true, false },
                new bool[] { false, false, true, false });

            Assert.TestExe(DefaultValue,
                new bool[] { false, false, true, true },
                new bool[] { false, false, false, true });
        }

        public bool[] DefaultValue(bool[] list)
        {
            if (list == null && list.Length == 0)
                return list;
            if (list.Length == 1)
            {
                list[0] = true;
                return list;
            }
            int n = list.Length;
            int index = 0;
            for (int i = 1; i < n; i++)
            {
                if (list[i])
                {
                    list[index] = false;
                    index = i;
                }
                if (i == n - 1 && !list[index])
                {
                    list[i] = true;
                }
            }
            return list;
        }

        public IList<T> SetDefaultValue<T>(IList<T> list, Func<T, bool> isDefault, Action<T, bool> setDefaultStatus)
        {
            if (list == null && list.Count == 0)
                return list;
            int n = list.Count;
            if (n == 1)
            {
                setDefaultStatus(list[0], true);
                return list;
            }
            int index = 0;
            for (int i = 1; i < n; i++)
            {
                if (isDefault(list[i]))
                {
                    setDefaultStatus(list[index], false);
                    index = i;
                }
                if (i == n - 1 && !isDefault(list[index]))
                {
                    setDefaultStatus(list[i], true);
                }
            }
            return list;
        }
    }
}
